#include <stdio.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>  // sockaddr_in 结构体类型

#include <stdlib.h>
#include <string.h>
#include <unistd.h>

// ./demo5 [<ip>] <port>
int main(int argc, char const *argv[])
{
    if(argc < 2) return -1;

    char *dest_ip = "127.0.0.1";  // 发送目标主机的IP
    uint16_t dest_port = 0; // 发送目标主机的端口号
    if(argc == 3){
        dest_ip = (char *)argv[1];
        dest_port = atoi(argv[2]);
    }else{
        dest_port = atoi(argv[1]);
    }


    // 1. 创建UDP套接字
    int sock_fd = socket(AF_INET, SOCK_DGRAM, 0); 
    if(sock_fd < 0) {
        perror("socket udp");
        return -1;
    }

    // 2. 定义目标主机的地址（IP、端口号，IP类型）
    struct  sockaddr_in send_addr;
    send_addr.sin_family = AF_INET; // IPv4
    send_addr.sin_port =  htons( dest_port );  // 端口号转成大端字节序
    send_addr.sin_addr.s_addr = inet_addr(dest_ip); 

    
    //3. 开始发送数据
    char buf[1024] = "";
    while(1){
        bzero(buf, 1024);
        printf("=> ");
        fgets(buf, 1024, stdin);
        buf[strlen(buf)-1] = 0; // 去\n

        ssize_t slen=sendto(sock_fd, buf, strlen(buf), 0, 
                    (struct sockaddr *)&send_addr, sizeof(send_addr));

        if(strncmp("exit", buf, 4) == 0) break;
    }
    close(sock_fd);  // 4. 通信结束，关闭socket套接字
    return 0;
}

